package main

import (
	"fmt"
	"sync"
	"time"
)

var num int = 0
var mu sync.Mutex

func main() {
	//方式一，使用闭包的方式
	go func() {
		fmt.Println("run goroutine in closure")
	}()

	go func(s string) {
		fmt.Println(s)
	}("gorouine: closure params")

	//方式二，使用函数的方式
	//启动一个新的 goroutine（可以理解为“子协程”或“子线程”）
	go doSomething("in goroutine: world")
	//在主goroutine（可以理解为“主线程”）
	doSomething("hello")

	for i := 0; i < 100; i++ {
		go func() {
			for j := 0; j < 100; j++ {
				safeIncreaseNum()
			}
		}()
	}

	// 等待一段时间确保所有goroutine完成(Go：主协程结束，所有 goroutine 都会被强制终止。)
	time.Sleep(time.Second)
	fmt.Printf("num:%d", num)
}

func doSomething(s string) {
	for i := 0; i < 10; i++ {
		fmt.Println(s)
	}
}

func increaseNum() {
	num += 1
}

func safeIncreaseNum() {
	mu.Lock()
	num++
	mu.Unlock()
}
